package com.loong.android;

import android.content.Context;
import android.content.pm.Signature;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Build;

import com.loong.android.utils.CharSequenceUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 应用信息
 */
public class AppInfo {

    private android.content.pm.PackageInfo packageInfo;

    public AppInfo() {
    }

    public AppInfo(android.content.pm.PackageInfo info) {
        packageInfo = info;
    }

    public boolean isValid() {
        return packageInfo != null;
    }

    /**
     * 返回操作的android.content.pm.PackageInfo对象
     */
    public android.content.pm.PackageInfo getPackageInfo() {
        return packageInfo;
    }

    /**
     * 取应用包名
     */
    public String packageName() {
        return packageInfo.packageName;
    }

    /**
     * 取应用包名的字段数组，仅在安卓5.0(api21)及以上版本才有效
     */
    public String[] splitNames() {
        if (Build.VERSION.SDK_INT < 21) return null;
        return packageInfo.splitNames;
    }

    /**
     * 取应用版本号
     */
    public int versionCode() {
        return packageInfo.versionCode;
    }

    /**
     * 取应用版本名
     */
    public String versionName() {
        return packageInfo.versionName;
    }

    /**
     * 取应用首次安装时间
     */
    public long firstInstallTime() {
        return packageInfo.firstInstallTime;
    }

    /**
     * 取应用上次安装时间
     */
    public long lastUpdateTime() {
        return packageInfo.lastUpdateTime;
    }

    /**
     * 取应用已申请的权限数组
     */
    public String[] requestedPermissions() {
        return packageInfo.requestedPermissions;
    }

    /**
     * 取应用签名信息数组
     */
    public String[] signatures() {
        Signature[] ss = packageInfo.signatures;
        if (ss == null) return null;
        List<String> arr = new ArrayList<>();
        for (Signature signature : ss) {
            arr.add(signature.toCharsString());
        }
        return arr.toArray(new String[0]);
    }

    // Drawable 转换成 Bitmap
    private static Bitmap drawable2Bitmap(Drawable drawable) {
        Bitmap bitmap = Bitmap
                .createBitmap(
                        drawable.getIntrinsicWidth(),
                        drawable.getIntrinsicHeight(),
                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
    }

    /**
     * 取应用的图标
     *
     * @param context 上下文
     */
    public Bitmap getIcon(Context context) {
        return drawable2Bitmap(packageInfo.applicationInfo.loadIcon(context.getPackageManager()));
    }

    /**
     * 取应用的名称
     *
     * @param context 上下文
     */
    public String getAppName(Context context) {
        return CharSequenceUtils.getText(packageInfo.applicationInfo.loadLabel(context.getPackageManager()));
    }

    /**
     * 取应用的安装路径
     */
    public String sourceDir() {
        return packageInfo.applicationInfo.sourceDir;
    }

    /**
     * 取应用的安装路径的公开部分
     */
    public String publicSourceDir() {
        return packageInfo.applicationInfo.publicSourceDir;
    }

    /**
     * 取应用安装路径的分割数组，仅在安卓5.0(api21)及以上版本才有效
     */
    public String[] splitSourceDirs() {
        if (Build.VERSION.SDK_INT < 21) return null;
        return packageInfo.applicationInfo.splitSourceDirs;
    }

    /**
     * 取应用安装路径公开部分的分割数组，仅在安卓5.0(api21)及以上版本才有效
     */
    public String[] splitPublicSourceDirs() {
        if (Build.VERSION.SDK_INT < 21) return null;
        return packageInfo.applicationInfo.splitPublicSourceDirs;
    }

    /**
     * 取应用最小Sdk版本，仅在安卓7.0(api24)及以上版本才有效
     */
    public int minSdkVersion() {
        if (Build.VERSION.SDK_INT < 24) return 0;
        return packageInfo.applicationInfo.minSdkVersion;
    }

    /**
     * 取应用目标Sdk版本
     */
    public int targetSdkVersion() {
        return packageInfo.applicationInfo.targetSdkVersion;
    }

    /**
     * 取应用标志位
     */
    public int getFlags() {
        return packageInfo.applicationInfo.flags;
    }
}
